package com.tuling.dynamic.datasource.aspect;

import com.tuling.dynamic.datasource.DynamicDataSource;
import com.tuling.dynamic.datasource.annotation.WR;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/***
 * @Author 程序员蜗牛
 */
/**
 * 动态数据源切面类，用于在切点执行前切换数据源。
 * 使用@Component注解将其实例化为一个Bean。
 * 使用@Aspect注解声明其为一个切面。
 */
@Component
@Aspect
public class DynamicDataSourceAspect implements Ordered {

    /**
     * 在方法执行前切入，用于根据注解切换数据源。
     * @param point 切点信息，包含目标方法等细节。
     * @param wr 方法上的WR注解，用于获取注解上的value值。
     * 此处通过获取注解上的value值来决定切换到哪个数据源。
     */
    // 前置
    @Before("within(com.tuling.dynamic.datasource.service.impl.*) && @annotation(wr)")
    public void before(JoinPoint point, WR wr){
        String name = wr.value();
        DynamicDataSource.name.set(name);
    }

    /**
     * 实现Ordered接口，返回切面的执行顺序。
     * @return 返回0，表示此切面应优先执行。
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

